package com.je.app.model;

import com.je.app.model.Turno;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;


@SuppressWarnings("serial")
public class Sesion implements java.io.Serializable {

	private int idSesion;
	
	@NotNull
	private Usuario usuario;
	
	@Min(0)
	private double cajaInicial;
	
	@Min(0)
	private double cajaFinal;

	@NotNull
	private Date horaInicio;
	
	private Date horaFin;
	
	private Set turnos = new HashSet(0);
	
	private Set movimientos = new HashSet(0);

	//@AssertTrue (message="La hora de finalizacion no puede ser anterior a la de inicio") //Valida que la fecha de fin sea posterior a la de inicio 
	private boolean isDateValid(){
		
		if(horaFin != null){
			return horaFin.after(horaInicio);	
		}
		
		return true;
		
	}
	
	public Sesion() {
	}

	public Sesion(int idSesion, Usuario usuario, double cajaInicial,
			double cajaFinal, Date horaInicio) {
		this.idSesion = idSesion;
		this.usuario = usuario;
		this.cajaInicial = Math.floor(cajaInicial* 100)/100;
		this.cajaFinal = Math.floor(cajaFinal* 100)/100;
		this.horaInicio = horaInicio;
	}

	public Sesion(int idSesion, Usuario usuario, double cajaInicial,
			double cajaFinal, Date horaInicio, Date horaFin, Set turnos,
			Set movimientos) {
		this.idSesion = idSesion;
		this.usuario = usuario;
		this.cajaInicial = Math.floor(cajaInicial* 100)/100;
		this.cajaFinal = Math.floor(cajaFinal* 100)/100;
		this.horaInicio = horaInicio;
		this.horaFin = horaFin;
		this.turnos = turnos;
		this.movimientos = movimientos;
	}

	public int getIdSesion() {
		return this.idSesion;
	}

	public void setIdSesion(int idSesion) {
		this.idSesion = idSesion;
	}

	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public double getCajaInicial() {
		return this.cajaInicial;
	}

	public void setCajaInicial(double cajaInicial) {
		this.cajaInicial = cajaInicial;
	}

	public double getCajaFinal() {
		recalcularSaldo();
		this.cajaFinal = Math.floor(cajaFinal* 100)/100;
		return this.cajaFinal;
	}

	public void setCajaFinal(double cajaFinal) {

		this.cajaFinal = Math.floor(cajaFinal* 100)/100;

	}

	public Date getHoraInicio() {
		return this.horaInicio;
	}

	public void setHoraInicio(Date horaInicio) {
		this.horaInicio = horaInicio;
	}

	public Date getHoraFin() {
		return this.horaFin;
	}

	public void setHoraFin(Date horaFin) {
		this.horaFin = horaFin;
	}

	public Set getTurnos() {
		return this.turnos;
	}

	public void setTurnos(Set turnos) {
		this.turnos = turnos;
	}

	public Set getMovimientos() {
		return this.movimientos;
	}

	public void setMovimientos(Set movimientos) {
		this.movimientos = movimientos;
	}

	public void finalizarTurno(Turno turno) {
		this.cajaFinal+=turno.getMontoConsumicion();
		this.cajaFinal+=turno.getMontoHabitacion();
		turno.setSesion(this);
		if(!turnos.contains(turno)) turnos.add(turno);
	}

	public boolean equals(Sesion sesion){
		return this.idSesion==sesion.idSesion;
	}

	public void addMovimiento(Movimiento movimientoNuevo){
		movimientos.add(movimientoNuevo);
		if(movimientoNuevo.getTipoMovimiento().equals("Ingreso")){
			this.cajaFinal +=movimientoNuevo.getMonto();
		}
		else{
			this.cajaFinal -=movimientoNuevo.getMonto();
		}
	}

	public void recalcularSaldo() {
		
		//sumatoria turnos
		double montoTurnos = 0;
		for(Object turno: this.turnos){
			montoTurnos += ((Turno) turno).getMontoConsumicion();
			montoTurnos += ((Turno) turno).getMontoHabitacion();
		}
		
		//sumatoria ingresos y egresos		
		double montoIngresos=0;
		double montoEgresos=0;
		for(Object movimiento: this.movimientos){
			if(((Movimiento) movimiento).getTipoMovimiento().equals("Ingreso"))
				montoIngresos += ((Movimiento) movimiento).getMonto();
			else
				montoEgresos += ((Movimiento) movimiento).getMonto();	
		}
				
		//calculofinal
		this.cajaFinal = this.cajaInicial + montoTurnos + montoIngresos - montoEgresos;
	}

	public void eliminarMovimiento(Movimiento movimientoSeleccionado) {

		if(movimientoSeleccionado.getTipoMovimiento().equals("Ingreso")){
			cajaFinal-=movimientoSeleccionado.getMonto();
		}
		else{
			cajaFinal+=movimientoSeleccionado.getMonto();
		}
		movimientos.remove(movimientoSeleccionado);
		
	}
	
	public String [] toArray(){
		//Utilizado para la tabla de sesiones
		String [] arrayRetorno = new String[]{ horaInicio.toLocaleString().split(" ")[0],
				usuario.getNombre() + " " + usuario.getApellido(),
				horaInicio.toLocaleString().split(" ")[1],
				horaFin.toLocaleString().split(" ")[1],
				"" + cajaInicial,"" + cajaFinal};
		return arrayRetorno;
	}
}
